/*
? JavaScript ES6的Map类有以下常见方法：
? -  clear() ：删除Map中的所有键值对
? -  delete(key) ：从Map中删除指定键的值
? -  entries() ：返回Map对象中所有键值对的数组
? -  forEach(callbackFn, thisArg) ：以插入顺序执行给定的回调函数
? -  get(key) ：获取指定键的值
? -  has(key) ：如果Map中存在指定键则返回 true ，否则返回 false
? -  keys() ：返回Map对象中所有键的数组
? -  set(key, value) ：向Map对象添加键值对
? -  size ：返回Map对象中键值对的数量
? -  values() ：返回Map对象中所有值的数组

? 除此之外，Map类还提供了 Symbol.iterator 属性，可以用于使用 for...of 循环遍历Map对象中的键值对。
 */

class Map2 {
    constructor(iterator = []) {
        if (typeof iterator[Symbol.iterator] !== 'function') {
            throw new Error('....')
        }
        this.map = {}
        for (const item of iterator) {
            if (typeof item[Symbol.iterator] !== "function") {
                throw new TypeError(`你提供的${item}不是一个可迭代的对象`);
            }
            //? 函数返回对象，此对象的next方法返回的Iterator对象(Iterator遍历器)包括value和done属性
            const iterator = item[Symbol.iterator]();
            console.log(iterator)
            //? 不一定是数组，所以用这种方式(数组这样也行啊)
            const key = iterator.next().value;
            const value = iterator.next().value;
            this.set(key, value);
        }
    }
    //? 其他方法没啥好写的
}

console.log([1, 2, 3, 4][Symbol.iterator]());
